/*
 * Copyright (c) 2024. hallele, Inc All rights reserved.
 */

package cn.hallele.infrastructure.log.config;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * hallele_mc_core
 *
 * @author anle5
 * @since 2024/9/12 22:29
 */
@Getter
@Setter
@Scope("refresh")
@Configuration
@ConfigurationProperties(prefix = "hal.mc.infrastructure.log")
public class HalLogProperties {
    /**
     * 是否开启日志掩码配置，默认不开启
     */
    private boolean enableMask = false;

    /**
     * 是否开启正则，如果开启则优先使用正则做掩码处理，为了节省性能，默认不使用
     * 如果maskKey未配置，但是pattern有配置，也会使用正则
     */
    private boolean enableRegex = false;

    /**
     * 默认替换规则合集
     */
    private List<MaskRule> maskRules = new ArrayList<>();

    /**
     * 非正则替换规则，关闭正则匹配规则后生效，也是默认规则
     */
    @Getter
    @Setter
    public static class MaskRule {
        /**
         * 正则表达式
         */
        private Pattern pattern;

        /**
         * <p>要被掩码的值,格式： key|startIndex,endIndex</p>
         * <ul>
         *     <li>key：要掩码的key值</li>
         *     <li>|：分隔符</li>
         *     <li>startIndex：key之后第n个字符开始掩码，这里是数学上的自然数，是从1开始</li>
         *     <li>endIndex：key之后第n个字符开始结束掩码，这里是数学上的自然数，是从1开始</li>
         * </ul>
         * <p>例如：name=123456789,配置值为：name=|2,5，maskValue是*</p>
         * <p>掩码后就是：name=1*6789</p>
         */
        private String maskKey;

        /**
         * <p>maskKey 命中后被替换成的样子</p>
         * <p>使用正则则是基于{@link Matcher#replaceAll(String)} 参数格式，如$1***$2</p>
         * <p>不使用正则则是普通字符串形式，如：*****</p>
         */
        private String maskValue;

        public void setPattern(String regex) {
            this.pattern = Pattern.compile(regex);
        }
    }
}
